package com.smart.community.region.entity;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.smart.community.commons.base.BaseEntity;
import com.smart.community.commons.dto.FileInfoDTO;
import com.smart.community.commons.utils.FileInfoUtils;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;

/**
 * 店铺信息实体类
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-09-30
 */
@Slf4j
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sc_shop")
public class Shop extends BaseEntity {
    /**
	 * @author Wu.Liang
	 * @date 2025年9月30日
	 */
	private static final long serialVersionUID = -2934271564182939076L;

	/**
     * 店铺名称
     */
    @TableField("shop_name")
    private String shopName;
    
    /**
     * 店铺编码
     */
    @TableField("shop_code")
    private String shopCode;
    
    /**
     * 店铺类型：1-餐饮，2-零售，3-服务，4-其他
     */
    @TableField("shop_type")
    private Integer shopType;
    
    /**
     * 所属社区ID
     */
    @TableField("community_id")
    private Long communityId;
    
    /**
     * 所属楼栋ID
     */
    @TableField("building_id")
    private Long buildingId;
    
    /**
     * 所属单元ID
     */
    @TableField("unit_id")
    private Long unitId;
    
    /**
     * 房间号
     */
    @TableField("room_number")
    private String roomNumber;
    
    /**
     * 楼层号
     */
    @TableField("floor_number")
    private Integer floorNumber;
    
    /**
     * 店铺面积（平方米）
     */
    @TableField("area")
    private BigDecimal area;
    
    /**
     * 租金价格
     */
    @TableField("rent_price")
    private BigDecimal rentPrice;
    
    /**
     * 联系人
     */
    @TableField("contact_person")
    private String contactPerson;
    
    /**
     * 联系电话
     */
    @TableField("contact_phone")
    private String contactPhone;
    
    /**
     * 营业执照号
     */
    @TableField("business_license")
    private String businessLicense;
    
    /**
     * 状态：0-禁用，1-启用
     */
    @TableField("status")
    private Integer status;
    
    /**
     * 备注
     */
    @TableField("remark")
    private String remark;
    
    /**
     * 店铺图片信息（JSON字符串格式存储URL数组）
     * 与其他模块保持一致的格式
     */
    @TableField("image_info")
    private String imageInfo;
    
    // ==================== 图片信息处理方法 ====================
    
    /**
     * 获取图片URL列表
     * 
     * @return 图片URL列表
     */
    public List<String> getImageUrls() {
        try {
            if (imageInfo == null || imageInfo.trim().isEmpty()) {
                return new ArrayList<>();
            }
            // 使用FileInfoUtils工具类解析JSON字符串为FileInfoDTO列表
            List<FileInfoDTO> fileInfoList = FileInfoUtils.fromJsonString(imageInfo);
            if (fileInfoList == null || fileInfoList.isEmpty()) {
                return new ArrayList<>();
            }
            // 提取URL列表
            return fileInfoList.stream()
                    .map(FileInfoDTO::getFileUrl)
                    .filter(url -> url != null && !url.trim().isEmpty())
                    .collect(Collectors.toList());
        } catch (Exception e) {
            log.error("解析店铺图片URL列表JSON失败，imageInfo: {}", imageInfo, e);
            return new ArrayList<>();
        }
    }
    
    /**
     * 设置图片URL列表
     * 
     * @param imageUrls 图片URL列表
     */
    public void setImageUrls(List<String> imageUrls) {
        try {
            if (imageUrls == null || imageUrls.isEmpty()) {
                this.imageInfo = null;
                return;
            }
            // 将URL列表转换为FileInfoDTO列表
            List<FileInfoDTO> fileInfoList = imageUrls.stream()
                    .map(url -> {
                        FileInfoDTO fileInfo = new FileInfoDTO();
                        fileInfo.setFileUrl(url);
                        fileInfo.setFileName(extractFileNameFromUrl(url));
                        fileInfo.setUploadType("SHOP_IMAGE");
                        fileInfo.setUploadSource("WEB");
                        fileInfo.setStatus("success");
                        fileInfo.setFileType("image/jpeg");
                        fileInfo.setIsPublic(true);
                        return fileInfo;
                    })
                    .collect(Collectors.toList());
            
            // 使用FileInfoUtils工具类转换为JSON字符串
            this.imageInfo = FileInfoUtils.toJsonString(fileInfoList);
        } catch (Exception e) {
            log.error("设置店铺图片URL列表JSON失败，imageUrls: {}", imageUrls, e);
        }
    }
    
    /**
     * 从URL中提取文件名
     * 
     * @param url 文件URL
     * @return 文件名
     */
    private String extractFileNameFromUrl(String url) {
        if (url == null || url.trim().isEmpty()) {
            return "unknown.jpg";
        }
        try {
            String fileName = url.substring(url.lastIndexOf("/") + 1);
            return fileName.isEmpty() ? "unknown.jpg" : fileName;
        } catch (Exception e) {
            return "unknown.jpg";
        }
    }
    
    
    /**
     * 获取第一张图片URL
     * 
     * @return 第一张图片URL，如果没有则返回null
     */
    public String getFirstImageUrl() {
        List<String> imageUrls = getImageUrls();
        if (imageUrls == null || imageUrls.isEmpty()) {
            return null;
        }
        return imageUrls.get(0);
    }
    
    /**
     * 获取图片数量
     * 
     * @return 图片数量
     */
    public int getImageCount() {
        List<String> imageUrls = getImageUrls();
        return imageUrls == null ? 0 : imageUrls.size();
    }
    
    /**
     * 添加图片URL
     * 
     * @param imageUrl 图片URL
     */
    public void addImageUrl(String imageUrl) {
        if (imageUrl == null || imageUrl.trim().isEmpty()) {
            return;
        }
        
        List<String> imageUrls = getImageUrls();
        if (imageUrls == null) {
            imageUrls = new ArrayList<>();
        }
        imageUrls.add(imageUrl);
        setImageUrls(imageUrls);
    }
    
    /**
     * 移除图片URL
     * 
     * @param imageUrl 图片URL
     */
    public void removeImageUrl(String imageUrl) {
        if (imageUrl == null || imageUrl.trim().isEmpty()) {
            return;
        }
        
        List<String> imageUrls = getImageUrls();
        if (imageUrls == null || imageUrls.isEmpty()) {
            return;
        }
        imageUrls.removeIf(url -> imageUrl.equals(url));
        setImageUrls(imageUrls);
    }
    
    /**
     * 清空所有图片信息
     */
    public void clearImageInfo() {
        this.imageInfo = null;
    }
    
    /**
     * 获取图片信息列表（FileInfoDTO格式）
     * 按照《用户上传文件功能使用指南.md》规范，将JSON字符串转换为FileInfoDTO列表
     * 
     * @return 图片信息列表
     */
    public List<FileInfoDTO> getImageInfoList() {
        try {
            if (imageInfo == null || imageInfo.trim().isEmpty()) {
                return new ArrayList<>();
            }
            
            // 使用FileInfoUtils工具类解析JSON字符串
            return FileInfoUtils.fromJsonString(imageInfo);
        } catch (Exception e) {
            log.error("解析店铺图片信息列表JSON失败，imageInfo: {}", imageInfo, e);
            return new ArrayList<>();
        }
    }
    
    /**
     * 设置图片信息列表（FileInfoDTO格式）
     * 按照《用户上传文件功能使用指南.md》规范，将FileInfoDTO列表转换为JSON字符串
     * 
     * @param imageInfoList 图片信息列表
     */
    public void setImageInfoList(List<FileInfoDTO> imageInfoList) {
        try {
            if (imageInfoList == null || imageInfoList.isEmpty()) {
                this.imageInfo = null;
                return;
            }
            
            // 使用FileInfoUtils工具类转换为JSON字符串
            this.imageInfo = FileInfoUtils.toJsonString(imageInfoList);
        } catch (Exception e) {
            log.error("设置店铺图片信息列表JSON失败，imageInfoList: {}", imageInfoList, e);
        }
    }
}
